﻿using System;
using System.Collections.Generic;
using System.Text;
using JRCore.protocol;

namespace YoSunSDK
{
    /// <summary>
    /// 按照友上文件名协议，进行转换
    /// </summary>
    public class YoSunPicName
    {

        /// <summary>
        /// 按友上文件名协议生成文件名
        /// </summary>
        /// <param name="param"></param>
        /// <returns>文件名字符串</returns>
        private static string MakeYosunPicName(SnapParam param)
        {
            string picNameYosun = "";
            string spliter = "_";

            //设备名(2)_路口代码(2)_方向代码(2)_车道(1)_时间(14)_红灯(2)_速度(3)_限速(3)_限速比(2)_车长(4)_车牌(8)_颜色(1)_抓拍位置(1)_识别状态(1)_超速比(2)_违法原因(4)_是否导出(1)_是否惩罚(1)_转向代码(1)_图片顺序(1)_图片总数(1)_红灯时间(3)逆行(1)_图片类型(是否闯红灯)(1)红名单(1)模糊车牌(1)智能抓拍违章类型(1)_行政区域(4)_行政区域(2)图片时间(2)_车身颜色 (1)路口代码百位(1)预留(2).jpg
            //括号内为字节的长度。

            //设备名(2) 33
            //device字段取值说明：31-高清电子警察 32-高清卡口型电子警察 33-高清卡口,34-高清固定超速,35-高清移动超速，36-高清单行线逆行
            switch (param.camtype)
            {
                case "HK":
                    picNameYosun += "32";
                    break;
                case "HK摄像机":
                    picNameYosun += "32";
                    break;
                case "HK主机":
                    picNameYosun += "32";
                    break;
                default:
                    picNameYosun += "32";
                    break;
            }

            //路口代码(2) 18
            picNameYosun += spliter + param.roadid;

            //方向代码(2) 01
            //direction字段取值说明：01-由东向西,02-由东向南,03-由东向北,04-由南向北,05-由南向西,06-由南向东,;07-由西向东,08-由西向北,09-由西向南,10-由北向南,11-由北向东,12-由北向西,13-进城,14-出城
            switch (param.camdirection)
            {
                case "由东向西":
                    picNameYosun += spliter + "01";
                    break;
                case "由南向北":
                    picNameYosun += spliter + "04";
                    break;
                case "由西向东":
                    picNameYosun += spliter + "07";
                    break;
                case "由北向南":
                    picNameYosun += spliter + "10";
                    break;
                default:
                    picNameYosun += spliter + "01";
                    break;
            }

            //车道(1) 1
            picNameYosun += spliter + param.cd;

            //时间(14) 20150421040300
            picNameYosun += spliter + param.yyyy + param.mm + param.dd + param.hh + param.mi + param.ss;

            //红灯(2) 00
            //闯红灯时间:单位0.1秒 卡口>25, 电警<25
            picNameYosun += spliter + "30";

            //速度(3) 051
            //获取的param.speed不是默认的3位
            ushort ushortSpeed = ushort.Parse(param.speed);
            picNameYosun += spliter + string.Format("{0:d3}", ushortSpeed);

            //限速(3) 110
            picNameYosun += spliter + "110";

            //限速比(2) 10
            picNameYosun += spliter + "10";

            //车长(4) 0422
            //车长要4个字符
            picNameYosun += spliter + "0000";

            //车牌(8) 10HF4463
            //plate1字段取值说明：车牌首字母代码，具体定义如下：车牌首字母“plate1”（汉字）序号，“京”对应1，依次向下:京(1)津(2)晋冀蒙辽吉黑沪苏(10)浙皖闽鲁豫鄂湘粤桂琼川贵云藏陕甘青宁渝军海空集北沈南兰广成济消水边电林通金警学特使领试港澳赣新(57)
            //车牌要进行转换

            #region 车牌中的汉字转换

            if (param.plate != "" && param.plate != "无车牌")
            {

                string strPlateProvince = "京津晋冀蒙辽吉黑沪苏浙皖闽鲁豫鄂湘粤桂琼川贵云藏陕甘青宁渝军海空集北沈南兰广成济消水边电林通金警学特使领试港澳赣新";

                //取车牌中的第一个字符
                string paramPlate = param.plate[0].ToString();
                int intPlate = (int)param.plate[0];

                string provinceCode = "00";

                //如果第一个字符为中文
                if (intPlate > 19968 && intPlate < 40869)
                {

                    try
                    {
                        provinceCode = (strPlateProvince.IndexOf(paramPlate) + 1).ToString().PadLeft(2, '0');
                    }
                    catch (Exception)
                    {
                        ;
                    }
                }

                //将第一个字符替换为相应的代码
                picNameYosun += spliter + param.plate.Replace(paramPlate, provinceCode).Substring(0, 8);
            }
            else
            {
                picNameYosun += spliter + "00000000";
            }

            if (picNameYosun.Contains("学"))
            {
                picNameYosun = picNameYosun.Replace("学", "x");
            }

            if (picNameYosun.Contains("警"))
            {
                picNameYosun = picNameYosun.Replace("警", "j");
            }

            if (picNameYosun.Contains("挂"))
            {
                picNameYosun = picNameYosun.Replace("挂", "g");
            }

            #endregion

            //车牌颜色(1) 1
            //杰瑞车牌颜色定义：0-1-2-3 蓝-黄-白-黑
            //友上车牌颜色定义：1-2-3-4 蓝-黑-黄-白
            switch (param.plateColor)
            {
                case "0":
                    picNameYosun += spliter + "1";
                    break;
                case "1":
                    picNameYosun += spliter + "3";
                    break;
                case "2":
                    picNameYosun += spliter + "4";
                    break;
                case "3":
                    picNameYosun += spliter + "2";
                    break;
                default:
                    picNameYosun += spliter + "1";
                    break;
            }

            //抓拍位置(1) 1
            //capPos字段取值说明：抓拍位置：1-车头，2-侧面, 3-车尾,4-顶部
            picNameYosun += spliter + "3";

            //识别状态(1) 1  1比对 0不比对
            picNameYosun += spliter + "1";

            //超速比(2) 00
            //overspeed字段取值说明：1 10-20%，2 20%-50%, 3 50%-70%, 4 70%以上 5 0-10%
            int overspeed = 0;
            try
            {
                overspeed = (int.Parse(param.speed) - int.Parse(param.speedlimit)) * 100 / int.Parse(param.speedlimit);
            }
            catch (Exception)
            {
                overspeed = 0;
            }

            if ((overspeed >= 10) && (overspeed < 20)) picNameYosun += spliter + "01";
            else if ((overspeed >= 20) && (overspeed < 50)) picNameYosun += spliter + "02";
            else if ((overspeed >= 50) && (overspeed < 70)) picNameYosun += spliter + "03";
            else if (overspeed >= 70) picNameYosun += spliter + "04";
            else if ((overspeed >= 0) && (overspeed < 10)) picNameYosun += spliter + "05";
            else picNameYosun += spliter + "00";

            //违法原因(4) 0000
            //reason字段取值说明：违法原因
            //dhBreakRules字段取值说明：违章情况：1-压车道线,2-违章左转,3-违章右转,4-违章掉头,5-违章停车,6-不按车道行驶,7-违章变道,8-压黄线
            picNameYosun += spliter + "0000";

            //是否导出(1) 0
            picNameYosun += spliter + "0";

            //是否惩罚(1) 0
            picNameYosun += spliter + "0";

            //转向代码(1) 3
            //turnCode字段取值说明：转向代码：1 左拐，2 直行，3 右拐，4 直左，5 直右
            //也就是对应的车道
            picNameYosun += spliter + param.cd;

            //图片顺序(1) 0
            picNameYosun += spliter + "1";

            //图片总数(1) 0
            picNameYosun += spliter + "1";

            //红灯时间(3)逆行(1) 0000
            picNameYosun += spliter + "0000";

            //图片类型(是否闯红灯)(1)红名单(1)模糊车牌(1)智能抓拍违章类型(1) 0000

            //picType字段取值说明：1为卡口，0为闯红灯
            //vip字段取值说明：红名单告警，0 不是，1是
            //fuzzy字段取值说明：模糊车牌告警：0不是，1是
            //state字段取值说明：0 正常, 1 逆行

            picNameYosun += spliter + "1000";

            //行政区域(4) 3208
            picNameYosun += spliter + "0000";

            //行政区域(2)图片时间(2) 3032
            picNameYosun += spliter + "0000";

            //车身颜色(1)路口代码百位(1)预留(2) 1000
            picNameYosun += spliter + param.carColor.Substring(0, 1) + "000";

            picNameYosun += ".jpg";

            return picNameYosun;
        }

        /// <summary>
        /// 按友上文件名协议生成文件名
        /// </summary>
        public static string CreateYosunPicName(DataRecvRecord DRRecord)
        {
            string picNameYosun = "";
            string spliter = "_";

            //设备名(2)_路口代码(2)_方向代码(2)_车道(1)_时间(14)_红灯(2)_速度(3)_限速(3)_限速比(2)_车长(4)_车牌(8)_颜色(1)_抓拍位置(1)_识别状态(1)_超速比(2)_违法原因(4)_是否导出(1)_是否惩罚(1)_转向代码(1)_图片顺序(1)_图片总数(1)_红灯时间(3)逆行(1)_图片类型(是否闯红灯)(1)红名单(1)模糊车牌(1)智能抓拍违章类型(1)_行政区域(4)_行政区域(2)图片时间(2)_车身颜色 (1)路口代码百位(1)预留(2).jpg
            //括号内为字节的长度。

            //设备名(2) 33
            //device字段取值说明：31-高清电子警察 32-高清卡口型电子警察 33-高清卡口,34-高清固定超速,35-高清移动超速，36-高清单行线逆行
            switch (DRRecord.P7)
            {
                case "HK":
                    picNameYosun += "32";
                    break;
                case "HK摄像机":
                    picNameYosun += "32";
                    break;
                case "HK主机":
                    picNameYosun += "32";
                    break;
                default:
                    picNameYosun += "32";
                    break;
            }

            //路口代码(2) 18
            picNameYosun += spliter + DRRecord.P14;

            //方向代码(2) 01
            //direction字段取值说明：01-由东向西,02-由东向南,03-由东向北,04-由南向北,05-由南向西,06-由南向东,;07-由西向东,08-由西向北,09-由西向南,10-由北向南,11-由北向东,12-由北向西,13-进城,14-出城
            switch (DRRecord.P16)
            {
                case "1":
                    picNameYosun += spliter + "01";
                    break;
                case "2":
                    picNameYosun += spliter + "04";
                    break;
                case "3":
                    picNameYosun += spliter + "07";
                    break;
                case "4":
                    picNameYosun += spliter + "10";
                    break;
                default:
                    picNameYosun += spliter + "01";
                    break;
            }

            //车道(1) 1
            picNameYosun += spliter + DRRecord.P17;

            //时间(14) 20150421040300
            string yyyy = DRRecord.P18.Substring(0, 4);
            string MM = DRRecord.P18.Substring(4, 2);
            string dd = DRRecord.P18.Substring(6, 2);
            string HH = DRRecord.P18.Substring(8, 2);
            string mm = DRRecord.P18.Substring(10, 2);
            string ss = DRRecord.P18.Substring(12, 2);
            string fff = DRRecord.P18.Substring(14, 3);
            picNameYosun += spliter + yyyy + MM + dd + HH + mm + ss;

            //红灯(2) 00
            //闯红灯时间:单位0.1秒 卡口>25, 电警<25
            picNameYosun += spliter + "30";

            //速度(3) 051
            //获取的param.speed不是默认的3位
            ushort ushortSpeed = ushort.Parse(DRRecord.P27);
            picNameYosun += spliter + string.Format("{0:d3}", ushortSpeed);

            //限速(3) 110
            picNameYosun += spliter + "110";

            //限速比(2) 10
            picNameYosun += spliter + "10";

            //车长(4) 0422
            //车长要4个字符
            picNameYosun += spliter + "0000";

            //车牌(8) 10HF4463
            //plate1字段取值说明：车牌首字母代码，具体定义如下：车牌首字母“plate1”（汉字）序号，“京”对应1，依次向下:京(1)津(2)晋冀蒙辽吉黑沪苏(10)浙皖闽鲁豫鄂湘粤桂琼川贵云藏陕甘青宁渝军海空集北沈南兰广成济消水边电林通金警学特使领试港澳赣新(57)
            //车牌要进行转换

            #region 车牌中的汉字转换

            if (DRRecord.P23 != "" && DRRecord.P23 != "无车牌")
            {

                string strPlateProvince = "京津晋冀蒙辽吉黑沪苏浙皖闽鲁豫鄂湘粤桂琼川贵云藏陕甘青宁渝军海空集北沈南兰广成济消水边电林通金警学特使领试港澳赣新";

                //取车牌中的第一个字符
                string paramPlate = DRRecord.P23[0].ToString();
                int intPlate = (int)DRRecord.P23[0];

                string provinceCode = "00";

                //如果第一个字符为中文
                if (intPlate > 19968 && intPlate < 40869)
                {

                    try
                    {
                        provinceCode = (strPlateProvince.IndexOf(paramPlate) + 1).ToString().PadLeft(2, '0');
                    }
                    catch (Exception)
                    {
                        ;
                    }
                }

                //将第一个字符替换为相应的代码
                picNameYosun += spliter + DRRecord.P23.Replace(paramPlate, provinceCode).Substring(0, 8);
            }
            else
            {
                picNameYosun += spliter + "00000000";
            }

            if (picNameYosun.Contains("学"))
            {
                picNameYosun = picNameYosun.Replace("学", "x");
            }

            if (picNameYosun.Contains("警"))
            {
                picNameYosun = picNameYosun.Replace("警", "j");
            }

            if (picNameYosun.Contains("挂"))
            {
                picNameYosun = picNameYosun.Replace("挂", "g");
            }

            #endregion

            //车牌颜色(1) 1
            //杰瑞车牌颜色定义：0-1-2-3 蓝-黄-白-黑
            //友上车牌颜色定义：1-2-3-4 蓝-黑-黄-白
            switch (DRRecord.P22)
            {
                case "0":
                    picNameYosun += spliter + "1";
                    break;
                case "1":
                    picNameYosun += spliter + "3";
                    break;
                case "2":
                    picNameYosun += spliter + "4";
                    break;
                case "3":
                    picNameYosun += spliter + "2";
                    break;
                default:
                    picNameYosun += spliter + "1";
                    break;
            }

            //抓拍位置(1) 1
            //capPos字段取值说明：抓拍位置：1-车头，2-侧面, 3-车尾,4-顶部
            picNameYosun += spliter + "3";

            //识别状态(1) 1  1比对 0不比对
            picNameYosun += spliter + "1";

            //超速比(2) 00
            //overspeed字段取值说明：1 10-20%，2 20%-50%, 3 50%-70%, 4 70%以上 5 0-10%
            int overspeed = 0;
            try
            {
                overspeed = (int.Parse(DRRecord.P27) - int.Parse(DRRecord.P26)) * 100 / int.Parse(DRRecord.P26);
            }
            catch (Exception)
            {
                overspeed = 0;
            }

            if ((overspeed >= 10) && (overspeed < 20)) picNameYosun += spliter + "01";
            else if ((overspeed >= 20) && (overspeed < 50)) picNameYosun += spliter + "02";
            else if ((overspeed >= 50) && (overspeed < 70)) picNameYosun += spliter + "03";
            else if (overspeed >= 70) picNameYosun += spliter + "04";
            else if ((overspeed >= 0) && (overspeed < 10)) picNameYosun += spliter + "05";
            else picNameYosun += spliter + "00";

            //违法原因(4) 0000
            //reason字段取值说明：违法原因
            //dhBreakRules字段取值说明：违章情况：1-压车道线,2-违章左转,3-违章右转,4-违章掉头,5-违章停车,6-不按车道行驶,7-违章变道,8-压黄线
            picNameYosun += spliter + "0000";

            //是否导出(1) 0
            picNameYosun += spliter + "0";

            //是否惩罚(1) 0
            picNameYosun += spliter + "0";

            //转向代码(1) 3
            //turnCode字段取值说明：转向代码：1 左拐，2 直行，3 右拐，4 直左，5 直右
            //也就是对应的车道
            picNameYosun += spliter + DRRecord.P17;

            //图片顺序(1) 0
            picNameYosun += spliter + "1";

            //图片总数(1) 0
            picNameYosun += spliter + "1";

            //红灯时间(3)逆行(1) 0000
            picNameYosun += spliter + "0000";

            //图片类型(是否闯红灯)(1)红名单(1)模糊车牌(1)智能抓拍违章类型(1) 0000

            //picType字段取值说明：0为闯红灯，1为卡口
            //vip字段取值说明：红名单告警，0 不是，1是
            //fuzzy字段取值说明：模糊车牌告警：0不是，1是
            //state字段取值说明：0 正常, 1 逆行
            picNameYosun += spliter + "1000";

            //行政区域(4) 3208
            picNameYosun += spliter + "0000";

            //行政区域(2)图片时间(2) 3032
            picNameYosun += spliter + "0000";

            //车身颜色(1)路口代码百位(1)预留(2) 1000
            picNameYosun += spliter + DRRecord.P24.Substring(0, 1) + "000";

            picNameYosun += ".jpg";

            return picNameYosun;
        }

    }
}
